﻿using System;

using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Windows.Forms;

namespace Maestro_Proveedores.evaluacionDeDesempeno.indicadores
{
    /// <remarks>
    /// <para>El indicador tiene como objetivo evaluar el cumplimiento del proveedor de acuerdo al porcentaje de unidades entregadas en los pedidos.</para>
    /// <para>NUE/NUP = (Número de Unidades Entregadas del ITEM / Número de Unidades Pactadas del ITEM) * 100</para>
    /// </remarks>
    class CumplimientoUnidadesEntregadas : Indicador
    {
        private MAPICS.MAPICSDataSet mAPICSdATAsET = new MAPICS.MAPICSDataSet();
        private MAPICS.MAPICSDataSetTableAdapters.INF_OCTableAdapter iNF_OCTableAdapter = new MAPICS.MAPICSDataSetTableAdapters.INF_OCTableAdapter();
        /// <summary>
        /// Cuando se crea una nueva instancia del indicador, se incializan todas sus variables y propiedades. Tanto las propias como las herededas de la calse Indicador
        /// </summary>
        public CumplimientoUnidadesEntregadas()
        {
            this.Peso = 0.15;
            this.TipoIndicador = Enums.TipoIndicador.Bien;
        }
        /// <summary>
        /// Redefinicion del metodo toString()
        /// </summary>
        /// <returns>Nombre Completo del presente indicador</returns>
        public override string ToString()
        {
            return "Cumplimiento de las Unidades Entregadas";
        }
        /// <summary>
        /// redefinición del metodo Calcular(), declarado en la clase padre Indicador como un metodo abstracto (se debe redefinir obligatoriamente en cualquier clase que herede de la clase Indicador)
        /// </summary>
        /// <returns></returns>
        protected override bool calcular()
        {
            try
            {
                //--- obtengo los parametros y los datos
                decimal fechaInf = decimal.Parse(MAESTROS.ClassVarios.FechaMAPIC(this.FechaInferior));
                decimal fechaSup = decimal.Parse(MAESTROS.ClassVarios.FechaMAPIC(this.FechaSuperior));

                double total_porcentaje_cantidad_faltante = 0;
                double total_registros = 0;
                
                //--- aqui se trae la informacion desde INFOR
                this.iNF_OCTableAdapter.FillByCodProvFechas_Entrega(this.mAPICSdATAsET.INF_OC, this.registroProveedor.id_proveedor, fechaInf, fechaSup);

                //--- calculo las cantidades no entregadas
                foreach (MAPICS.MAPICSDataSet.INF_OCRow row in this.mAPICSdATAsET.INF_OC)
                {
                    //--- los ITEMs de las ordenes de compra con estado 99 estan ANULADAS, por esa razon no se tienen en cuenta para realizar la evaluacion de desempeño
                    if (!MAESTROS.ClassVarios.LimpiarCadena(row.ESTADO_OC).Equals("99"))
                    {
                        DateTime fechaEsperada = MAESTROS.ClassVarios.FechaMAPIC(row.FECHA_ENTR_R.ToString());

                        if (fechaEsperada <= DateTime.Now)
                        {
                            if (row.ULT_REC.Equals(0))
                            {
                                DateTime fechaReal = DateTime.Parse(DateTime.Now.ToShortDateString());
                                if ((ConfiguracionDelSistema.DiasMaximosDeRetraso + (fechaEsperada - fechaReal).TotalDays) >= 0)
                                {
                                    total_porcentaje_cantidad_faltante += double.Parse((row.CAN_ENTR / row.CAN_SOL).ToString());
                                    total_registros++;                                    
                                }
                                else
                                {
                                   // MessageBox.Show(this.ToString() + "\n" + row.COD_OC +"\n"+ row.NUM_ITEM + "\n" + total_registros + "\nDias de diferencia: " + (fechaEsperada - fechaReal).TotalDays);
                                }
                            }
                            else
                            {
                                total_porcentaje_cantidad_faltante += double.Parse((row.CAN_ENTR / row.CAN_SOL).ToString());
                                total_registros++;
                            }
                            //MessageBox.Show(total_registros + "\nt%cal " + total_porcentaje_cantidad_faltante + "\ncod_oc " + row.COD_OC + "\nnum_item " + row.NUM_ITEM + "\ncan_entreg " + row.CAN_ENTR + "\ncan_dev " + row.CAN_DEV + "\nfecha_max " + row.FECHA_ENTR_R + "\ncan_sol " + row.CAN_SOL + "\nprv " + row.COD_PRV);
                        }
                        else
                        {
                            //--- aquellos ITEM's que no se les halla vencido el plazo de entrega no seran tenidos en cuenta en este indicador.
                            // MessageBox.Show("DESCARTADO.\n"+total_registros + "\nt%cal " + total_porcentaje_cantidad_faltante + "\ncod_oc " + row.COD_OC + "\nnum_item " + row.NUM_ITEM + "\ncan_entreg " + row.CAN_ENTR + "\ncan_dev " + row.CAN_DEV + "\nfecha_max " + row.FECHA_ENTR_R + "\ncan_sol " + row.CAN_SOL + "\nprv " + row.COD_PRV);
                        }
                    }
                }

                //--- si no hay registros, el indicador no aplica

                if (total_registros == 0)
                {
                    return false;
                }
                                
                //--- Guardo el resultado del indicador
                this.Resultado = (total_porcentaje_cantidad_faltante / total_registros)*100;

//                MessageBox.Show(total_porcentaje_cantidad_faltante + "/" + total_registros + " * 100=" + this.Resultado);

                //--- calculo las cantidades faltantes promedio y aplico la definicion del Indicador (consultar Proyecto: sistema_gestion_de_proveedores_2009)
                
                if (this.Resultado ==100)
                {
                    this.PorcentajeEvaluacion = 100;
                }
                else if (this.registroProveedor.grupo_servicio.Contains("A -") && this.Resultado >= 90)
                {
                    this.PorcentajeEvaluacion = 75;
                }
                else if (!this.registroProveedor.grupo_servicio.Contains("A -") && this.Resultado >= 85)
                {
                    this.PorcentajeEvaluacion = 75;
                }
                else if (this.Resultado >= 70)
                {
                    this.PorcentajeEvaluacion = 50;
                }
                else
                {
                    this.PorcentajeEvaluacion = 25;
                }
                return true;
            }
            catch (SqlException ex)
            {
                Maestro_Proveedores.herramientas.MessageException.show(ex);
                return false;
            }
        }

    }
}